package com.vviton.zyhj.common.base;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import redis.clients.jedis.Jedis;

import com.alibaba.fastjson.JSON;
import com.vviton.zyhj.common.common.HCacheConstants;
import com.vviton.zyhj.common.dao.TYyxtCodeMapper;
import com.vviton.zyhj.common.entity.TYyxtCode;
import com.vviton.zyhj.common.utils.DateUtils;
import com.vviton.zyhj.common.utils.FileBean;
import com.vviton.zyhj.common.utils.FileUtils;
import com.vviton.zyhj.common.utils.HttpClientUtil;
import com.vviton.zyhj.common.utils.ResultJson;
import com.vviton.zyhj.common.utils.hbase.HBaseUtils;
import com.vviton.zyhj.common.utils.idgen.IdMake;
import com.vviton.zyhj.common.utils.idgen.RandomKey;
import com.wdcloud.hcache.redis.connection.DataSourceManager;
import com.wdcloud.hcache.redis.connection.IRedisTemplate;
import com.wdcloud.hcache.redis.connection.RedisCallback;

/**
 * ClassName: BaseService <br/>
 * Function: 基础服务类. <br/>
 * Date: 2016年11月10日 下午4:06:00 <br/>
 *
 * @author weiming.chen
 * @version 1.0
 * @since JDK 1.7
 */
@Service
public class BaseService {

    /** 新的id生成策略 */
    @Autowired
    private IdMake idMake;

    /** 码表Mapper **/
    @Autowired
    private TYyxtCodeMapper tYyxtCodeMapper;

    /** 配置文件 **/
    @Autowired
    private AppConfig appConfig;

    //定义的删除redis部分数据所需要的天数
    //	private static final int DELDAY = 7;

    /** 过期时间 */
    private static final int EXPIRETIME = 300;

    /** 日志记录 */
    private static Logger logger = Logger.getLogger(BaseService.class);

    /** 客服会话队列用户Key：用户账户 */
    public static final String KFHH_KEY_YHZH = "yhzh";
    /** 客服会话队列用户Key：最后连接时间 */
    public static final String KFHH_KEY_LCT = "lastConnTime";
    /** 客服会话队列用户Key：课堂id */
    public static final String KFHH_KEY_FZID = "fzid";
    /** 离线消息会话信息Key：会话关闭 */
    public static final String KFHH_KEY_CLOSED = "closed";
    /** 离线消息会话信息Key：创建时间 */
    public static final String HHXX_KEY_CT = "creatertime";

    /**
     * 保存文本内容到分布式文件系统
     *
     * @param content 内容
     * @param url 上传地址
     * @return 文件保存的信息
     */
    public ResultJson saveTxtToDFS(String url, String content) {
        String suffix = ".txt";
        String uuid = UUID.randomUUID().toString();
        String fileName = uuid + suffix;
        File file = FileUtils.writeTextTempFile(fileName, content);
        ResultJson ret = HttpClientUtil.httpPostFile(url, file);
        file.delete();
        if (ret.isResult()) {
            String message = ret.getMessage();
            if (StringUtils.isNotBlank(message)) {
                Object msgObj = JSONObject.fromObject(message).get("msgObj");
                if (msgObj != null) {
                    JSONArray mesArr = JSONArray.fromObject(msgObj);
                    if (mesArr != null && mesArr.size() > 0) {
                        JSONObject mes = JSONObject.fromObject(mesArr.get(0));
                        Object filePathObj = mes.get("fileId");
                        Object fileSizeObj = mes.get("fileSize");
                        Object fileNameObj = mes.get("fileName");
                        Object fileExtNameObj = mes.get("fileExtName");
                        FileBean fb = new FileBean();
                        fb.setFileName(fileNameObj == null ? "" : fileNameObj.toString());
                        fb.setFilePath(filePathObj == null ? "" : filePathObj.toString());
                        fb.setFileExtName(fileExtNameObj == null ? "" : fileExtNameObj.toString());
                        fb.setFileSize(fileSizeObj == null ? "" : fileSizeObj.toString());
                        ResultJson retV = new ResultJson(true);
                        retV.setObject(fb);
                        return retV;
                    }
                }
            }
        }
        return new ResultJson(false);
    }

    /**
     * 根据文件地址获取文件文本内容
     *
     * @param url 文件地址
     * @return 文本内容
     */
    public ResultJson readTxtFromDFS(String url) {
        try {
            URL cUrl = new URL(url);
            URLConnection conn = cUrl.openConnection();
            InputStream is = conn.getInputStream();
            String res = FileUtils.readTxtStream(is);
            is.close();
            ResultJson ret = new ResultJson(true);
            ret.setObject(res);
            return ret;
        } catch (IOException e) {
        }
        return new ResultJson(false);
    }

    /**
     * 设置重复提交唯一Token
     *
     * @param tokenId 令牌
     * @param val 需要临时保存的对象
     */
    public void setResubmitToken(final String tokenId, final Object val) {
        if (StringUtils.isNotBlank(tokenId)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.CH_REDIS_DS_NAME);
            redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    Date now = new Date();
                    //					for(int i=1;i<=DELDAY;i++){
                    //						Calendar calendar = new GregorianCalendar();
                    //						calendar.setTime(now);
                    //						calendar.add(Calendar.DATE,-i);
                    //						//删除指定天数的记录
                    //						String ystDt = DateUtils.format(calendar.getTime(), DateUtils.PATTERN_DATE);
                    //						String ystTokenKeyPkg = HCacheConstants.YW_REDIS_NAME+":"+HCacheConstants.RESUBMIT_TOKEN+":"+ystDt;
                    //						Set<String> keys = jedis.keys(ystTokenKeyPkg+":*");
                    //						if(keys != null && keys.size() > 0){
                    //							for (String a : keys) {
                    //								jedis.del(a);
                    //					        }
                    //						}
                    //					}

                    //插入当前日期TOKEN
                    String datePkg = DateUtils.format(now, DateUtils.PATTERN_DATE);
                    String tokenKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.RESUBMIT_TOKEN + ":" + datePkg + ":" + tokenId;
                    String value = "";
                    if (val != null) {
                        value = JSON.toJSONString(val);
                    }
                    return jedis.setex(tokenKey, EXPIRETIME, value);
                }
            });
        }
    }

    /**
     * 验证重复提交的token
     *
     * @param tokenId 令牌
     * @param retClazz 对象
     * @return 存在返回对象
     */
    public ResultJson verifyResubmitToken(final String tokenId, final Class<?> retClazz) {
        final ResultJson ret = new ResultJson(false);
        if (StringUtils.isNotBlank(tokenId)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.CH_REDIS_DS_NAME);
            redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    Date today = new Date();
                    String datePkg = DateUtils.format(today, DateUtils.PATTERN_DATE);
                    String tokenKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.RESUBMIT_TOKEN + ":" + datePkg + ":" + tokenId;
                    Boolean exists = jedis.exists(tokenKey);
                    if (exists) {
                        ret.setResult(true);
                        String value = jedis.get(tokenKey);
                        if (StringUtils.isNotBlank(value) && retClazz != null) {
                            ret.setObject(JSON.parseObject(value, retClazz));
                        }
                    }
                    return ret;
                }
            });
        }
        return ret;
    }

    /**
     * getKey,(统一关系型数据库主键生成策略). <br/>
     * Author: weiming.chen <br/>
     * Create Date: 2016年11月10日 <br/>
     * ===============================================================<br/>
     * Modifier: weiming.chen <br/>
     * Modify Date: 2016年11月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @return 返回主键
     * @since JDK 1.7
     */
    public String getKey() {
        return String.valueOf(idMake.nextId());
    }

    /**
     * getVersion,(获取版本号). <br/>
     * Author: Administrator <br/>
     * Create Date: 2016年11月10日 <br/>
     * ===============================================================<br/>
     * Modifier: Administrator <br/>
     * Modify Date: 2016年11月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param tableName
     * @return 返回对应的版本
     * @since JDK 1.7
     */
    public String getVersion() {
        return String.valueOf(RandomKey.getKey());
    }

    /**
     * getCouponId,(获取优惠券id). <br/>
     * Author: weiming.chen <br/>
     * Create Date: 2016年11月3日 <br/>
     * ===============================================================<br/>
     * Modifier: weiming.chen <br/>
     * Modify Date: 2016年11月3日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @return
     * @since JDK 1.7
     */
    public String getCouponId() {
        return String.valueOf(RandomKey.getUUID());
    }

    /**
     * @Author zhangzj
     * @Date 2015年11月16日 下午3:18:14
     * @param cpywbh 产品业务编号
     * @return 当前该产品的销售数量
     * @Desc 根据产品业务编号获取销售数量
     */
    public Long getCpxsslByCpywbh(final String cpywbh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpywbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cpxsslKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CP_KC_MGT + ":" + cpywbh + "_USED";
                    String cnt = jedis.get(cpxsslKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * 根据产品业务编号进行库存的回滚
     *
     * @param cpywbh 产品业务编号
     * @param rollbackQty 库存回滚的数量
     * @param limited 限制数
     * @return 成功返回 剩余库存
     */
    public ResultJson rollbackKC(final String cpywbh, final Integer rollbackQty, final Boolean limited) {
        final ResultJson ret = new ResultJson(true);
        Integer restCnt = 0;
        if (StringUtils.isNotBlank(cpywbh) && rollbackQty != null) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            restCnt = (Integer) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String usedKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CP_KC_MGT + ":" + cpywbh + "_USED";
                    String restKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CP_KC_MGT + ":" + cpywbh + "_REST";
                    Boolean exists = jedis.exists(restKey);
                    Integer restQty = 0;
                    if (exists) {
                        restQty = Integer.parseInt(jedis.get(restKey));
                        if (limited) {
                            restQty = Integer.parseInt(jedis.incrBy(restKey, rollbackQty).toString());
                        }
                    }
                    jedis.decrBy(usedKey, rollbackQty);
                    return restQty;
                }
            });
        }
        ret.setObject(restCnt);
        return ret;
    }

    /**
     * 根据产品业务编号进行库存的扣除
     *
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param cpywbh 产品业务编号
     * @param reduceQty 扣减的库存
     * @param totalQty 当前总数量
     * @param limited 限制数
     * @return 剩余库存数目
     */
    public ResultJson reduceKC(final String cpywbh, final Integer reduceQty, final Integer totalQty, final Boolean limited) {
        final ResultJson ret = new ResultJson(true);
        Integer restCnt = 0;
        if (limited) {
            if (totalQty.compareTo(reduceQty) < 0) {
                ret.setResult(false);
                ret.setObject(totalQty);
                ret.setMessage("store qty is less than reduce qty!");
                return ret;
            }
        }
        if (StringUtils.isNotBlank(cpywbh) && reduceQty != null && totalQty != null) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            restCnt = (Integer) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String totKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CP_KC_MGT + ":" + cpywbh + "_TOTAL";
                    String usedKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CP_KC_MGT + ":" + cpywbh + "_USED";
                    String restKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CP_KC_MGT + ":" + cpywbh + "_REST";
                    Boolean exists = jedis.exists(totKey);
                    Integer restQty = 0;
                    if (exists) {
                        Integer currTotal = Integer.parseInt(jedis.get(totKey));
                        if (currTotal.compareTo(totalQty) != 0) {
                            jedis.set(totKey, String.valueOf(totalQty));
                            restQty = totalQty;
                            if (limited) {
                                restQty = totalQty - reduceQty;
                            }
                            jedis.set(restKey, String.valueOf(restQty));
                            jedis.incrBy(usedKey, reduceQty);
                        } else {
                            restQty = Integer.parseInt(jedis.get(restKey).toString());
                            if (limited) {
                                if (restQty.compareTo(reduceQty) < 0) {
                                    ret.setResult(false);
                                    ret.setObject(restQty);
                                    ret.setMessage("store qty is less than reduce qty!");
                                    return restQty;
                                }
                                restQty = Integer.parseInt(jedis.decrBy(restKey, reduceQty).toString());
                            }
                            jedis.incrBy(usedKey, reduceQty);
                        }
                        return restQty;
                    } else {
                        jedis.set(totKey, totalQty.toString());
                        restQty = totalQty;
                        if (limited) {
                            restQty = totalQty - reduceQty;
                        }
                        jedis.incrBy(restKey, restQty);
                        jedis.incrBy(usedKey, reduceQty);
                        return restQty;
                    }
                }
            });
        }
        ret.setObject(restCnt);
        return ret;
    }

    /**
     * 根据产品业务编号进行库存的验证
     *
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param cpywbh 产品业务编号
     * @param reduceQty 扣减的库存
     * @param totalQty 当前总数量
     * @return 够或不够
     */
    public ResultJson verifyKC(final String cpywbh, final Integer reduceQty, final Integer totalQty) {
        final ResultJson ret = new ResultJson(true);
        Integer restCnt = 0;
        if (StringUtils.isNotBlank(cpywbh) && reduceQty != null && totalQty != null) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            restCnt = (Integer) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String totKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CP_KC_MGT + ":" + cpywbh + "_TOTAL";
                    String restKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CP_KC_MGT + ":" + cpywbh + "_REST";
                    Boolean exists = jedis.exists(totKey);
                    Integer restQty = 0;
                    if (exists) {
                        Integer currTotal = Integer.parseInt(jedis.get(totKey));
                        if (currTotal.compareTo(totalQty) != 0) {
                            if (totalQty.compareTo(reduceQty) < 0) {
                                ret.setResult(false);
                                ret.setObject(totalQty);
                                ret.setMessage("store qty is less than reduce qty!");
                                return totalQty;
                            }
                            restQty = totalQty - reduceQty;
                        } else {
                            restQty = Integer.parseInt(jedis.get(restKey).toString());
                            if (restQty.compareTo(reduceQty) < 0) {
                                ret.setResult(false);
                                ret.setObject(restQty);
                                ret.setMessage("store qty is less than reduce qty!");
                                return restQty;
                            }
                        }
                        return restQty;
                    } else {
                        restQty = totalQty;
                        if (totalQty.compareTo(reduceQty) < 0) {
                            ret.setResult(false);
                            ret.setObject(totalQty);
                            ret.setMessage("store qty is less than reduce qty!");
                            return totalQty;
                        }
                        return restQty;
                    }
                }
            });
        }
        ret.setObject(restCnt);
        return ret;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param zh 课堂中心账号
     * @return 当前对应的产品业务编号
     * @Desc 根据课堂中心账号生成对应的产品编号
     */
    public String generateCPYWBHByZh(final String zh) {
        Long currBh = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currBh = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cpbhPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.YWBH_REDIS_KEY_PKG_CPBH + ":" + zh;
                    return jedis.incr(cpbhPkgKey);
                }
            });
        }
        return zh + currBh.toString();
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param ktId 对应产品提供第三方的KTID
     * @return 当前对应的订单业务编号
     * @Desc 消费账号生成对应的订单编号
     */
    public String generateDDYWBHByKtId(final String ktId) {
        Long currBh = 0L;
        if (StringUtils.isNotBlank(ktId)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currBh = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cpbhPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.YWBH_REDIS_KEY_PKG_DDBH + ":" + ktId;
                    return jedis.incr(cpbhPkgKey);
                }
            });
        }
        return ktId + currBh.toString();
    }

    /**
     * generateHdbh,活动编号生成，规则为当前日期+自增序列号. <br/>
     * Author: weiming.chen <br/>
     * Create Date: 2016年4月19日 <br/>
     * ===============================================================<br/>
     * Modifier: weiming.chen <br/>
     * Modify Date: 2016年4月19日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param ktId 对应活动提供第三方的KTID
     * @return 活动编号
     * @since JDK 1.7
     */
    public String generateHdbh(final String ktId) {
        StringBuffer hdbh = new StringBuffer();
        Long currBh = 0L;
        if (StringUtils.isNotBlank(ktId)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currBh = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String hdbhPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.YWBH_REDIS_KEY_PKG_HDBH + ":" + ktId;
                    return jedis.incr(hdbhPkgKey);
                }
            });
            DateTime dt = new DateTime();
            hdbh.append(dt.toString(DateUtils.PATTERN_DATE_HBASE));
            hdbh.append(currBh.toString());
        }
        return hdbh.toString();
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param cpbh 产品编号
     * @param isAdd 是否添加
     * @return 当前该产品对应的收藏次数
     * @Desc 根据产品编号增加或取消收藏次数
     */
    public Long cntCPFavorites(final String cpbh, final Boolean isAdd) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntFavCpPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_FAV_REDIS_KEY_PKG_CP + ":" + cpbh;
                    if (isAdd) {
                        return jedis.incr(cntFavCpPkgKey);
                    } else {
                        return jedis.decr(cntFavCpPkgKey);
                    }
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param cpbh 产品编号
     * @return 当前该产品对应的收藏次数
     * @Desc 根据产品编号获取收藏次数
     */
    public Long getCPFavoritesCnt(final String cpbh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntFavCpPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_FAV_REDIS_KEY_PKG_CP + ":" + cpbh;
                    String cnt = jedis.get(cntFavCpPkgKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param zh 合作方账号
     * @param isAdd 是否添加
     * @return 当前该产品对应的收藏次数
     * @Desc 根据合作方账号增加或取消收藏次数
     */
    public Long cntHZFFavorites(final String zh, final Boolean isAdd) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntFAVHZFPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_FAV_REDIS_KEY_PKG_HZF + ":" + zh;
                    if (isAdd) {
                        return jedis.incr(cntFAVHZFPkgKey);
                    } else {
                        return jedis.decr(cntFAVHZFPkgKey);
                    }
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param zh 合作方账号
     * @return 当前该合作方账号对应的收藏次数
     * @Desc 根据合作方账号获取收藏次数
     */
    public Long getHZFFavoritesCnt(final String zh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntFavHzfPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_FAV_REDIS_KEY_PKG_HZF + ":" + zh;
                    String cnt = jedis.get(cntFavHzfPkgKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param cpbh 产品编号
     * @param isAdd 是否添加
     * @return 当前该产品对应的浏览次数
     * @Desc 根据产品编号增加或取消浏览次数
     */
    public Long cntCPView(final String cpbh, final Boolean isAdd) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntViewCpPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_VIEW_REDIS_KEY_PKG_CP + ":" + cpbh;
                    if (isAdd) {
                        return jedis.incr(cntViewCpPkgKey);
                    } else {
                        return jedis.decr(cntViewCpPkgKey);
                    }
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param cpbh 产品编号
     * @return 当前该产品对应的浏览次数
     * @Desc 根据产品编号获取浏览次数
     */
    public Long getCPViewCnt(final String cpbh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntViewCpPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_VIEW_REDIS_KEY_PKG_CP + ":" + cpbh;
                    String cnt = jedis.get(cntViewCpPkgKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param zh 合作方账号
     * @param isAdd 是否添加
     * @return 当前该合作方对应的浏览次数
     * @Desc 根据账号增加或取消浏览次数
     */
    public Long cntHZFView(final String zh, final Boolean isAdd) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntViewHZFPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_VIEW_REDIS_KEY_PKG_HZF + ":" + zh;
                    if (isAdd) {
                        return jedis.incr(cntViewHZFPkgKey);
                    } else {
                        return jedis.decr(cntViewHZFPkgKey);
                    }
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param zh 合作方账号
     * @return 当前该合作方账号对应的浏览次数
     * @Desc 根据合作方账号获取浏览次数
     */
    public Long getHZFViewCnt(final String zh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntViewHzfPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_VIEW_REDIS_KEY_PKG_HZF + ":" + zh;
                    String cnt = jedis.get(cntViewHzfPkgKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param cpbh 产品编号
     * @param isAdd 是否添加
     * @return 当前该产品对应的举报次数
     * @Desc 根据产品编号增加或取消举报次数
     */
    public Long cntCPComplaint(final String cpbh, final Boolean isAdd) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntCMPLCpPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_CMPL_REDIS_KEY_PKG_CP + ":" + cpbh;
                    if (isAdd) {
                        return jedis.incr(cntCMPLCpPkgKey);
                    } else {
                        return jedis.decr(cntCMPLCpPkgKey);
                    }
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param cpbh 产品编号
     * @return 当前该产品编号对应的投诉次数
     * @Desc 根据产品编号获取投诉次数
     */
    public Long getCPComplaintCnt(final String cpbh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntCmplCpPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_CMPL_REDIS_KEY_PKG_CP + ":" + cpbh;
                    String cnt = jedis.get(cntCmplCpPkgKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param zh 合作方账号
     * @param isAdd 是否增加
     * @return 当前该合作方对应的举报次数
     * @Desc 根据账号增加或取消举报次数
     */
    public Long cntHZFComplaint(final String zh, final Boolean isAdd) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntCMPLHZFPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_CMPL_REDIS_KEY_PKG_HZF + ":" + zh;
                    if (isAdd) {
                        return jedis.incr(cntCMPLHZFPkgKey);
                    } else {
                        return jedis.decr(cntCMPLHZFPkgKey);
                    }
                }
            });
        }
        return currCnt;
    }

    /**
     * @Author daizehua
     * @Date 2015年9月10日 下午5:18:14
     * @param zh 合作方账号
     * @return 当前该合作方账号对应的投诉次数
     * @Desc 根据合作方账号获取投诉次数
     */
    public Long getHZFComplaintCnt(final String zh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntCmplHzfPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_CMPL_REDIS_KEY_PKG_HZF + ":" + zh;
                    String cnt = jedis.get(cntCmplHzfPkgKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * @Desc 根据产品编号增加或取消评论次数
     * @Author zhangzhijian
     * @Date 2015年11月2日下午5:08:10
     * @param cpbh 产品ID
     * @param isAdd （true:增加评论次数，false：减少评论次数）
     * @return Long 最新评论次数
     */
    public Long cntCPComments(final String cpbh, final Boolean isAdd) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntCmtCpPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_CMT_REDIS_KEY_PKG_CP + ":" + cpbh;
                    if (isAdd) {
                        return jedis.incr(cntCmtCpPkgKey);
                    } else {
                        return jedis.decr(cntCmtCpPkgKey);
                    }
                }
            });
        }
        return currCnt;
    }

    /**
     * @Desc 根据产品编号获取评论次数
     * @Author zhangzhijian
     * @Date 2015年11月2日下午5:08:10
     * @param cpbh 产品ID
     * @return Long 评论次数
     */
    public Long getCPCommentsCnt(final String cpbh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(cpbh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntCmtCpPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_CMT_REDIS_KEY_PKG_CP + ":" + cpbh;
                    String cnt = jedis.get(cntCmtCpPkgKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * @Desc 根据合作方账号增加或取消评论次数
     * @Author zhangzhijian
     * @Date 2015年11月2日下午5:08:10
     * @param zh 合作方账号
     * @param isAdd （true:增加评论次数，false：减少评论次数）
     * @return Long 最新评论次数
     */
    public Long cntHZFComments(final String zh, final Boolean isAdd) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntCmtHZFPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_CMT_REDIS_KEY_PKG_HZF + ":" + zh;
                    if (isAdd) {
                        return jedis.incr(cntCmtHZFPkgKey);
                    } else {
                        return jedis.decr(cntCmtHZFPkgKey);
                    }
                }
            });
        }
        return currCnt;
    }

    /**
     * @Desc 根据合作方账号获取评论次数
     * @Author zhangzhijian
     * @Date 2015年11月2日下午5:08:10
     * @param zh 合作方账号
     * @return Long 评论次数
     */
    public Long getHZFCommentsCnt(final String zh) {
        Long currCnt = 0L;
        if (StringUtils.isNotBlank(zh)) {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
            currCnt = (Long) redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    String cntCmtHzfPkgKey = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.CNT_CMT_REDIS_KEY_PKG_HZF + ":" + zh;
                    String cnt = jedis.get(cntCmtHzfPkgKey);
                    if (StringUtils.isNotBlank(cnt)) {
                        return Long.parseLong(cnt);
                    }
                    return 0L;
                }
            });
        }
        return currCnt;
    }

    /**
     * @Desc 取得实体对象的表名称
     * @Author zhangzj
     * @Date 2015年10月8日 上午9:45:25
     * @param clazz 实体Class
     * @return String
     */
    public String getTableName(Class<?> clazz) {
        return HBaseUtils.getHTableName(clazz);
    }

    /**
     * 国际化整合对应的对象
     *
     * @param gjhMap 国际化Map
     * @param entity 实体对象
     * @param lkey 语言的key
     * @return 返回国际化后的对象
     */
    public Object langObject(Map<String, Map<String, String>> gjhMap, Object entity, String lkey) {
        if (entity != null && gjhMap != null && StringUtils.isNotBlank(lkey)) {
            Field[] parentFields = entity.getClass().getSuperclass().getDeclaredFields();
            Field[] currfields = entity.getClass().getDeclaredFields();
            boolean flag = false;
            for (Field field : currfields) {
                String fieldName = field.getName();
                Map<String, String> langMap = gjhMap.get(fieldName);
                if (langMap != null) {
                    flag = true;
                    String langVal = langMap.get(lkey);
                    if (StringUtils.isNotBlank(langVal)) {
                        try {
                            field.setAccessible(true);
                            field.set(entity, langVal);
                        } catch (Exception e) {
                            logger.info("国际化语言失败,对象:" + entity.getClass().toString() + ",属性:" + fieldName);
                        }
                    }
                }
            }
            if (!flag && parentFields.length > 0) {
                for (Field field : parentFields) {
                    String fieldName = field.getName();
                    Map<String, String> langMap = gjhMap.get(fieldName);
                    if (langMap != null) {
                        String langVal = langMap.get(lkey);
                        if (StringUtils.isNotBlank(langVal)) {
                            try {
                                field.setAccessible(true);
                                field.set(entity, langVal);
                            } catch (Exception e) {
                                logger.info("国际化语言失败,对象:" + entity.getClass().toString() + ",属性:" + fieldName);
                            }
                        }
                    }
                }
            }

        }
        return entity;
    }

    /**
     * @Desc 适用于非集群的环境
     * @Author nifang
     * @Date 2015年12月7日 下午4:10:50
     * @param cacheKeys 缓存键值list，键值支持模糊匹配(for example：1、key="h*llo",*表示一或多个字符; 2、key="h?llo",?表示一个字符; key="h[aex]llo",表示只匹配hallo或hello或hxllo)
     */
    public void mistyEvictCache(final List<String> cacheKeys) {
        try {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            String cacheDSName = HCacheConstants.CH_REDIS_DS_NAME;
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(cacheDSName);
            redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    for (String key : cacheKeys) {
                        Set<String> keys = jedis.keys(key);
                        if (keys != null && keys.size() > 0) {
                            for (String k : keys) {
                                jedis.del(k);
                            }
                        }
                    }
                    return jedis;
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     *
     * evictCache,(根据明确指定的key, 删除redis中的缓存). <br/>
     * Author: nifang <br/>
     * Create Date: 2016年3月15日 <br/>
     * ===============================================================<br/>
     * Modifier: nifang <br/>
     * Modify Date: 2016年3月15日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param cacheKeys 要删除的key的集合
     * @since JDK 1.7
     */
    public void evictCache(final List<String> cacheKeys) {
        try {
            DataSourceManager dataSourceManager = DataSourceManager.newInstance();
            String cacheDSName = HCacheConstants.CH_REDIS_DS_NAME;
            IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(cacheDSName);
            redisTemplate.execute(false, new RedisCallback<Object>() {
                @Override
                public Object execute(Jedis jedis) {
                    for (String key : cacheKeys) {
                        Boolean flag = jedis.exists(key);
                        if (flag != null && flag) {
                            jedis.del(key);
                        }
                    }
                    return jedis;
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * getZxxscByRedis,通过redis查询对应资源的总学习时长. <br/>
     * Author: yaojie <br/>
     * Create Date: 2016年6月1日 <br/>
     * ===============================================================<br/>
     * Modifier: yaojie <br/>
     * Modify Date: 2016年6月1日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @return 总学习时间
     * @since JDK 1.7
     */
    public String getZxxscByRedis() {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        String res = (String) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                String key = HCacheConstants.YW_REDIS_NAME + ":" + HCacheConstants.SAVE_ZXXSC_REDIS_KEY_PKG_WDZY;
                return jedis.get(key);
            }
        });
        return res;
    }

    /**
     * 
     * saveKfhhQueueKey,保存客服会话队列的key. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月14日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月14日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param queueKey 队列key
     * @param isZxzx 是否在线咨询
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson saveKfhhQueueKey(final String queueKey, final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(queueKey)) {
                    String keysPkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_KEYS : HCacheConstants.SAVE_REDIS_PKG_LXXX_KEYS;
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + keysPkg;
                    jedis.sadd(key, queueKey);
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * removeKfhhQueueKey,移除客服会话队列的key. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月14日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月14日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param queueKey 队列key
     * @param isZxzx 是否在线咨询
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson removeKfhhQueueKey(final String queueKey, final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(queueKey)) {
                    String keysPkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_KEYS : HCacheConstants.SAVE_REDIS_PKG_LXXX_KEYS;
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + keysPkg;
                    jedis.srem(key, queueKey);
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * findAllKfhhQueueKey,获取全部客服会话队列的key. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月14日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月14日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param isZxzx 是否在线咨询
     * @return key列表
     * @since JDK 1.7
     */
    @SuppressWarnings("unchecked")
    public Set<String> findAllKfhhQueueKey(final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        Set<String> res = (Set<String>) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                String keysPkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_KEYS : HCacheConstants.SAVE_REDIS_PKG_LXXX_KEYS;
                String key = HCacheConstants.YYXT_REDIS_CT + ":" + keysPkg;
                return jedis.smembers(key);
            }
        });
        return res;
    }

    /**
     * 
     * addYhInKfhhQueue,在客服会话队列中加入新排队用户. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年8月31日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年8月31日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param fzid 分组id
     * @param yhzh 用户帐号
     * @param isZxzx 是否在线咨询
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson addYhInKfhhQueue(final String fzid, final String yhzh, final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @SuppressWarnings("unchecked")
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(fzid) && StringUtils.isNotBlank(yhzh)) {
                    String queuePkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_QUEUE : HCacheConstants.SAVE_REDIS_PKG_LXXX_QUEUE;
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + queuePkg + ":" + fzid;
                    // 判断用户帐号是否在队列中
                    boolean exist = false;
                    List<String> valueList = jedis.lrange(key, 0, -1);
                    for (int i = 0; i < valueList.size(); i++) {
                        if (StringUtils.isNotBlank(valueList.get(i))) {
                            Map<String, String> map = com.alibaba.fastjson.JSONObject.parseObject(valueList.get(i), Map.class);
                            if (StringUtils.isNotBlank(map.get(KFHH_KEY_YHZH)) && map.get(KFHH_KEY_YHZH).equals(yhzh)) {
                                exist = true;
                                // 更新最后连接时间
                                map.put(KFHH_KEY_LCT, DateUtils.format(new Date(), DateUtils.PATTERN_DATETIME));
                                jedis.lset(key, i, com.alibaba.fastjson.JSONObject.toJSONString(map));
                            }
                        }
                    }
                    // 如果不存在则加入队列
                    if (!exist) {
                        Map<String, String> map = new HashMap<String, String>();
                        map.put(KFHH_KEY_YHZH, yhzh);
                        map.put(KFHH_KEY_LCT, DateUtils.format(new Date(), DateUtils.PATTERN_DATETIME));
                        map.put(KFHH_KEY_CLOSED, new Boolean(false).toString());
                        jedis.rpush(key, com.alibaba.fastjson.JSONObject.toJSONString(map));
                        saveKfhhQueueKey(key, isZxzx);
                    }
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * getYhInKfhhQueue,在客服会话队列中获取前方排队用户. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年8月31日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年8月31日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param fzid 分组id
     * @param num 获取会话数量，如果小于1则获取全部
     * @param isZxzx 是否在线咨询
     * @return 排队用户列表
     * @since JDK 1.7
     */
    @SuppressWarnings("unchecked")
    public List<String> getYhInKfhhQueue(final String fzid, final Long num, final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        List<String> res = (List<String>) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                List<String> valueList = new ArrayList<String>();
                if (StringUtils.isNotBlank(fzid) && num != null) {
                    String queuePkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_QUEUE : HCacheConstants.SAVE_REDIS_PKG_LXXX_QUEUE;
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + queuePkg + ":" + fzid;
                    long end = num > 0 ? num - 1 : -1;
                    for (String value : jedis.lrange(key, 0, end)) {
                        if (StringUtils.isNotBlank(value)) {
                            Map<String, String> map = com.alibaba.fastjson.JSONObject.parseObject(value, Map.class);
                            valueList.add(map.get(KFHH_KEY_YHZH));
                        }
                    }
                }
                return valueList;
            }
        });
        return res;
    }

    /**
     * 
     * removeYhInKfhhQueue,在客服会话队列中移除排队用户. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年8月31日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年8月31日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param fzid 分组id
     * @param num 移除会话数量，如果小于1则移除全部
     * @param isZxzx 是否在线咨询
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson removeYhInKfhhQueue(final String fzid, final Long num, final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(fzid) && num != null) {
                    String queuePkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_QUEUE : HCacheConstants.SAVE_REDIS_PKG_LXXX_QUEUE;
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + queuePkg + ":" + fzid;
                    long end = num > 0 ? num - 1 : -1;
                    List<String> valueList = jedis.lrange(key, 0, end);
                    for (String value : valueList) {
                        jedis.lrem(key, 1, value);
                    }
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * removeYhInKfhhQueueByZh,在客服会话队列中移除排队用户. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月1日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月1日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param fzid 分组id
     * @param yhzh 用户帐号
     * @param isZxzx 是否在线咨询
     * @return 执行结果
     * @since JDK 1.7
     */
    @SuppressWarnings("unchecked")
    public ResultJson removeYhInKfhhQueueByZh(final String fzid, final String yhzh, final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(fzid) && StringUtils.isNotBlank(yhzh)) {
                    String queuePkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_QUEUE : HCacheConstants.SAVE_REDIS_PKG_LXXX_QUEUE;
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + queuePkg + ":" + fzid;
                    for (String value : jedis.lrange(key, 0, -1)) {
                        if (StringUtils.isNotBlank(value)) {
                            Map<String, String> map = com.alibaba.fastjson.JSONObject.parseObject(value, Map.class);
                            if (StringUtils.isNotBlank(map.get(KFHH_KEY_YHZH)) && map.get(KFHH_KEY_YHZH).equals(yhzh)) {
                                jedis.lrem(key, 1, value);
                                break;
                            }
                        }
                    }
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * getYhPositionInKfhhQueue,获取用户在客服会话队列中的排队位置. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月2日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月2日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param fzid 分组id
     * @param yhzh 用户帐号
     * @param isZxzx 是否在线咨询
     * @return 排队位置，如果为-1则不存在
     * @since JDK 1.7
     */
    @SuppressWarnings("unchecked")
    public Integer getYhPositionInKfhhQueue(final String fzid, final String yhzh, final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        Integer res = (Integer) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                Integer position = new Integer(-1);
                if (StringUtils.isNotBlank(fzid) && StringUtils.isNotBlank(yhzh)) {
                    String queuePkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_QUEUE : HCacheConstants.SAVE_REDIS_PKG_LXXX_QUEUE;
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + queuePkg + ":" + fzid;
                    List<String> valueList = jedis.lrange(key, 0, -1);
                    for (int i = 0; i < valueList.size(); i++) {
                        if (StringUtils.isNotBlank(valueList.get(i))) {
                            Map<String, String> map = com.alibaba.fastjson.JSONObject.parseObject(valueList.get(i), Map.class);
                            if (StringUtils.isNotBlank(map.get(KFHH_KEY_YHZH)) && map.get(KFHH_KEY_YHZH).equals(yhzh)) {
                                position = i;
                                // 更新最后连接时间
                                map.put(KFHH_KEY_LCT, DateUtils.format(new Date(), DateUtils.PATTERN_DATETIME));
                                jedis.lset(key, i, com.alibaba.fastjson.JSONObject.toJSONString(map));
                                break;
                            }
                        }
                    }
                }
                return position;
            }
        });
        return res;
    }

    /**
     * 
     * removeExpiredYhInKfhhQueue,在客服会话队列中移除连接过期用户. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月13日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月13日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param isZxzx 是否在线咨询
     * @param expireTime 过期时间
     * @return 执行结果
     * @since JDK 1.7
     */
    @SuppressWarnings("unchecked")
    public ResultJson removeExpiredYhInKfhhQueue(final boolean isZxzx, final Integer expireTime) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                Set<String> keys = findAllKfhhQueueKey(isZxzx);
                List<String> valueList = null;
                for (String key : keys) {
                    valueList = jedis.lrange(key, 0, 1);
                    if (valueList != null && valueList.size() > 0 && StringUtils.isNotBlank(valueList.get(0))) {
                        //如果队列有效，判断队列第一个用户是否连接超时
                        Map<String, String> yh = com.alibaba.fastjson.JSONObject.parseObject(valueList.get(0), Map.class);
                        if (StringUtils.isNotBlank(yh.get(KFHH_KEY_LCT))) {
                            Date lastConnTime = DateUtils.parseDate(yh.get(KFHH_KEY_LCT), DateUtils.PATTERN_DATETIME);
                            if (lastConnTime != null && (new Date().getTime() - lastConnTime.getTime() < expireTime * 1000)) {
                                continue;
                            }
                        }
                        jedis.lrem(key, 1, valueList.get(0));
                    } else {
                        //如果key没有有效队列，则删除key
                        removeKfhhQueueKey(key, isZxzx);
                    }
                }
                rs.setResult(true);
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * findAllFrontYhInKfhhQueue,在客服会话队列中获取所有首个用户. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月18日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月18日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param isZxzx 是否在线咨询
     * @return 用户集合
     * @since JDK 1.7
     */
    @SuppressWarnings("unchecked")
    public Set<Map<String, String>> findAllFrontYhInKfhhQueue(final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        Set<Map<String, String>> res = (Set<Map<String, String>>) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                Set<Map<String, String>> rs = new HashSet<Map<String, String>>();
                List<String> valueList = null;
                Set<String> keys = findAllKfhhQueueKey(isZxzx);
                if (keys != null) {
                    for (String key : keys) {
                        valueList = jedis.lrange(key, 0, 1);
                        if (valueList != null && valueList.size() > 0 && StringUtils.isNotBlank(valueList.get(0))) {
                            Map<String, String> yh = com.alibaba.fastjson.JSONObject.parseObject(valueList.get(0), Map.class);
                            yh.put(KFHH_KEY_FZID, key.split(":")[2]);
                            rs.add(yh);
                        } else {
                            //如果key没有有效队列，则删除key
                            removeKfhhQueueKey(key, isZxzx);
                        }
                    }
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * addXxjlInLxxxCache,在离线消息缓存中加入消息记录. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月20日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月20日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param zxrwid 咨询任务id
     * @param xxjl 消息记录
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson addXxjlInLxxxCache(final String zxrwid, final JSONObject xxjl) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(zxrwid) && xxjl != null) {
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + HCacheConstants.SAVE_REDIS_PKG_LXXX_CACHE + ":" + zxrwid;
                    jedis.rpush(key, xxjl.toString());
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * getXxjlListInLxxxCache,在离线消息缓存中获取消息记录. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月20日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月20日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param zxrwid 咨询任务id
     * @return 消息记录列表
     * @since JDK 1.7
     */
    public List<JSONObject> getXxjlListInLxxxCache(final String zxrwid) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        @SuppressWarnings("unchecked")
        List<JSONObject> res = (List<JSONObject>) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                List<JSONObject> valueList = new ArrayList<JSONObject>();
                if (StringUtils.isNotBlank(zxrwid)) {
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + HCacheConstants.SAVE_REDIS_PKG_LXXX_CACHE + ":" + zxrwid;
                    for (String value : jedis.lrange(key, 0, -1)) {
                        if (StringUtils.isNotBlank(value)) {
                            valueList.add(JSONObject.fromObject(value));
                        }
                    }
                    //jedis.del(key);
                }
                return valueList;
            }
        });
        return res;
    }

    /**
     * 
     * removeLxxxCache,删除离线消息缓存. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月26日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月26日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param zxrwid 咨询任务id
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson removeLxxxCache(final String zxrwid) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(zxrwid)) {
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + HCacheConstants.SAVE_REDIS_PKG_LXXX_CACHE + ":" + zxrwid;
                    jedis.del(key);
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * saveLxxxHhxxKey,保存离线消息会话信息key. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年10月8日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年10月8日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param hhxxKey 会话信息key
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson saveLxxxHhxxKey(final String hhxxKey) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(hhxxKey)) {
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + HCacheConstants.SAVE_REDIS_PKG_LXXX_HHXX_KEYS;
                    jedis.sadd(key, hhxxKey);
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * removeLxxxHhxxKey,移除离线消息会话信息key. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年10月8日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年10月8日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param hhxxKey 会话信息key
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson removeLxxxHhxxKey(final String hhxxKey) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(hhxxKey)) {
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + HCacheConstants.SAVE_REDIS_PKG_LXXX_HHXX_KEYS;
                    jedis.srem(key, hhxxKey);
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * addLxxxHhxx,新增离线消息会话信息. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月30日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月30日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param zxrwid 咨询任务id
     * @param hhxx 会话信息
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson addLxxxHhxx(final String zxrwid, final JSONObject hhxx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(zxrwid) && hhxx != null) {
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + HCacheConstants.SAVE_REDIS_PKG_LXXX_HHXX + ":" + zxrwid;
                    hhxx.put("creatertime", DateUtils.format(new Date(), DateUtils.PATTERN_DATETIME));
                    jedis.set(key, hhxx.toString());
                    saveLxxxHhxxKey(key);
                    rs.setResult(true);
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * getAndRemoveLxxxHhxx,获取并且移除离线消息会话信息. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年9月30日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年9月30日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param zxrwid 咨询任务id
     * @return 会话信息
     * @since JDK 1.7
     */
    public JSONObject getAndRemoveLxxxHhxx(final String zxrwid) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        JSONObject res = (JSONObject) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                JSONObject valueJson = null;
                if (StringUtils.isNotBlank(zxrwid)) {
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + HCacheConstants.SAVE_REDIS_PKG_LXXX_HHXX + ":" + zxrwid;
                    String value = jedis.get(key);
                    if (StringUtils.isNotBlank(value)) {
                        valueJson = JSONObject.fromObject(value);
                        jedis.del(key);
                        removeLxxxHhxxKey(key);
                    }
                }
                return valueJson;
            }
        });
        return res;
    }

    /**
     * 
     * removeExpiredLxxxHhxx,移除过期离线消息会话信息. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年10月8日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年10月8日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param expireTime 过期时间
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson removeExpiredLxxxHhxx(final Integer expireTime) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                String key = HCacheConstants.YYXT_REDIS_CT + ":" + HCacheConstants.SAVE_REDIS_PKG_LXXX_HHXX_KEYS;
                Set<String> keys = jedis.smembers(key);
                for (String hhxxKey : keys) {
                    String value = jedis.get(hhxxKey);
                    if (StringUtils.isNotBlank(value)) {
                        JSONObject hhxx = JSONObject.fromObject(value);
                        if (hhxx != null && StringUtils.isNotBlank(hhxx.getString(HHXX_KEY_CT))) {
                            Date creatertime = DateUtils.parseDate(hhxx.getString(HHXX_KEY_CT), DateUtils.PATTERN_DATETIME);
                            if (creatertime != null && (new Date().getTime() - creatertime.getTime() < expireTime * 1000)) {
                                continue;
                            }
                        }
                        jedis.del(hhxxKey);
                    }
                    jedis.srem(key, hhxxKey);
                }
                rs.setResult(true);
                return rs;
            }
        });
        return res;
    }

    /**
     * closeLxxxHhxx,在客服会话队列中关闭用户. <br/>
     * Author: Dengshiyu <br/>
     * Create Date: 2016年10月27日 <br/>
     * ===============================================================<br/>
     * Modifier: Dengshiyu <br/>
     * Modify Date: 2016年10月27日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param fzid 分组id
     * @param zxrwid 在线咨询id
     * @param isZxzx 是否在线咨询
     * @return 执行结果
     * @since JDK 1.7
     */
    public ResultJson closeYhInKfhhQueue(final String fzid, final String zxrwid, final boolean isZxzx) {
        DataSourceManager dataSourceManager = DataSourceManager.newInstance();
        IRedisTemplate redisTemplate = dataSourceManager.getRedisTemplate(HCacheConstants.YW_REDIS_DS_NAME);
        ResultJson res = (ResultJson) redisTemplate.execute(false, new RedisCallback<Object>() {
            @SuppressWarnings("unchecked")
            @Override
            public Object execute(Jedis jedis) {
                ResultJson rs = new ResultJson(false);
                if (StringUtils.isNotBlank(zxrwid)) {
                    String queuePkg = isZxzx ? HCacheConstants.SAVE_REDIS_PKG_ZXZX_QUEUE : HCacheConstants.SAVE_REDIS_PKG_LXXX_QUEUE;
                    String key = HCacheConstants.YYXT_REDIS_CT + ":" + queuePkg + ":" + fzid;
                    List<String> valueList = jedis.lrange(key, 0, -1);
                    for (int i = 0; i < valueList.size(); i++) {
                        if (StringUtils.isNotBlank(valueList.get(i))) {
                            Map<String, String> map = com.alibaba.fastjson.JSONObject.parseObject(valueList.get(i), Map.class);
                            if (StringUtils.isNotBlank(map.get(KFHH_KEY_YHZH)) && map.get(KFHH_KEY_YHZH).equals(zxrwid)) {
                                map.put(KFHH_KEY_CLOSED, new Boolean(true).toString());
                                jedis.lset(key, i, com.alibaba.fastjson.JSONObject.toJSONString(map));
                                rs.setResult(true);
                                break;
                            }
                        }
                    }
                }
                return rs;
            }
        });
        return res;
    }

    /**
     * 
     * getCodeMapCodeclass,(根据CodeClass获取CodeMap). <br/>
     * Author: nifang <br/>
     * Create Date: 2016年11月16日 <br/>
     * ===============================================================<br/>
     * Modifier: nifang <br/>
     * Modify Date: 2016年11月16日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param codeclass 代码
     * @return CodeMap
     * @since JDK 1.7
     */
    public Map<String, TYyxtCode> getCodeMapCodeclass(String codeclass) {
        List<TYyxtCode> codelist = tYyxtCodeMapper.getYyxtCodeListByCodeclass(codeclass);
        Map<String, TYyxtCode> codeMap = new HashMap<String, TYyxtCode>();
        for (TYyxtCode code : codelist) {
            String key = codeclass + code.getCode();
            codeMap.put(key, code);
        }
        return codeMap;
    }

    /**
     * 
     * getCodeListByCodeClass,(根据codeclass获取code列表). <br/>
     * Author: nifang <br/>
     * Create Date: 2016年11月16日 <br/>
     * ===============================================================<br/>
     * Modifier: nifang <br/>
     * Modify Date: 2016年11月16日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param codeclass 代码
     * @return code列表
     * @since JDK 1.7
     */
    public List<TYyxtCode> getCodeListByCodeClass(String codeclass) {
        List<TYyxtCode> codelist = tYyxtCodeMapper.getYyxtCodeListByCodeclass(codeclass);
        return codelist;
    }

}
